package pe.com.lgutierrez.campeonato.service.impl;

import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.lgutierrez.campeonato.dao.JugadorDao;
import pe.com.lgutierrez.campeonato.entidad.Jugador;
import pe.com.lgutierrez.campeonato.service.JugadorService;
import pe.com.lgutierrez.campeonato.service.JugadorValidacionService;
import pe.com.lgutierrez.campeonato.utils.ProcesarArchivoExcel;
import pe.com.lgutierrez.campeonato.utils.ProcesarArchivoExcel2007;

@Service
public class JugadorServiceImpl implements JugadorService {

	@Autowired
	private JugadorDao jugadorDao;
	@Autowired
	private ProcesarArchivoExcel procesarArchivoExcel;
	@Autowired
	private ProcesarArchivoExcel2007 procesarArchivoExcel2007;
	@Autowired
	private JugadorValidacionService jugadorValidacionService;
	
	public Integer procesarIngresoArchivo(List<Jugador> jugadores) {
		// TODO Auto-generated method stub
		Long ultimoId =  jugadorDao.obtenerUltimoIdJugador();
		
		for(Jugador jugador : jugadores) {
			ultimoId++;
			String codigo = generarCodigoJugador(jugador,ultimoId);
			jugador.setCodigoJugador(codigo);
			if(jugador.getNacionalizado()==null) {
				jugador.setNacionalizado(false);
			}
			jugador.setSexo(true);
			
			if(jugador.getPeso()==null) {
				jugador.setPeso(new Double(0));
			}
			
			if(jugador.getEstatura()==null) {
				jugador.setEstatura(new Double(0));
			}
			
		}
		jugadorDao.actualizarJugadores(jugadores);
		return 1;
	}

	public String generarCodigoJugador(Jugador jugador,Long idCorrelativo) {
		// TODO Auto-generated method stub
		String formatoNumero = "";
		if(idCorrelativo<10) {
			formatoNumero = "00" + idCorrelativo;
		}else if (idCorrelativo<100) {
			formatoNumero = "0" + idCorrelativo;
		}else {
			formatoNumero = idCorrelativo.toString();
		}
		
		return jugador.getApellidoPaterno().substring(0, 1).toString()
		+ jugador.getPrimerNombre().substring(0, 1).toString()
		+ jugador.getNacionalidad().substring(0, 1) + formatoNumero;
		
	}
	
	public String generarCodigoJugador(Jugador jugador) {
		// TODO Auto-generated method stub
		return jugador.getApellidoPaterno().substring(0, 2)
		+ jugador.getPrimerNombre().substring(0, 2)
		+ jugador.getNacionalidad().substring(0, 2);
	}

	public void procesarEnvioArchivoJugadores(InputStream archivoEnviado) {
		// TODO Auto-generated method stub
		List<Object> listaEnvio = procesarArchivoExcel2007.leerExcel(archivoEnviado);
		List<Jugador> jugadoresAInsertar = obtenerJugadoresEnviados(listaEnvio);
		List<Map<String, Object>> errores = jugadorValidacionService.validarObligatoriedadDatosJugadores(jugadoresAInsertar);
		if(errores.isEmpty()) {
			procesarIngresoArchivo(jugadoresAInsertar);
		}else {
			System.out.println("errores : " + errores.size());
		}
		
		
	 }

	@SuppressWarnings("unchecked")
	public List<Jugador> obtenerJugadoresEnviados(List<Object> listaEnvio){
		List<Jugador> listaJugadores = new ArrayList<Jugador>();
		for (int i = 0; i < listaEnvio.size(); i++) {
			List<Object> cellTempList = (List<Object>) listaEnvio.get(i); 
	            if (cellTempList.size() > 0) {
	                XSSFCell hssfCell = (XSSFCell) cellTempList.get(0);
	                String apellidoPaterno = hssfCell.toString();
	                
	                hssfCell = (XSSFCell) cellTempList.get(1);
	                String apellidoMaterno = hssfCell.toString();
	                
	                hssfCell = (XSSFCell) cellTempList.get(2);
	                String nombres = hssfCell.toString();
	                
	                
	                hssfCell = (XSSFCell) cellTempList.get(3);	                
	                String posicion = hssfCell.toString();
	                
	                hssfCell = (XSSFCell) cellTempList.get(4);	                
	                String pais = hssfCell.toString();
	                
	                hssfCell = (XSSFCell) cellTempList.get(5);
	                String fechaNacimiento = hssfCell.toString();
	                
	                hssfCell = (XSSFCell) cellTempList.get(6);
	                String edad = hssfCell.toString();

	                hssfCell = (XSSFCell) cellTempList.get(7);
	                String peso = hssfCell.toString();
	                
	                hssfCell = (XSSFCell) cellTempList.get(8);
	                String estatura = hssfCell.toString();
	                SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
	                
	                
	                Jugador jugador = new Jugador();
	                jugador.setPrimerNombre(nombres);
	                jugador.setApellidoPaterno(apellidoPaterno);
	                jugador.setApellidoMaterno(apellidoMaterno);
	                jugador.setDesPoscion(posicion);
	                try {
						jugador.setFechaNacimiento(dateFormat.parse(fechaNacimiento));
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
	                if(!estatura.isEmpty()) {
	                	jugador.setEstatura(new Double(estatura.substring(0, estatura.length()-1)));
	                }
	                if(!peso.isEmpty()) {
	                	jugador.setPeso(new Double(peso.substring(0,peso.length()-2)));
	                }
	                
	                jugador.setNacionalidad(pais);
	                listaJugadores.add(jugador);
	            }
	     }
		return listaJugadores;
	}

	public void setJugadorDao(JugadorDao jugadorDao) {
		this.jugadorDao = jugadorDao;
	}

	public void setProcesarArchivoExcel(ProcesarArchivoExcel procesarArchivoExcel) {
		this.procesarArchivoExcel = procesarArchivoExcel;
	}

	public void setProcesarArchivoExcel2007(
			ProcesarArchivoExcel2007 procesarArchivoExcel2007) {
		this.procesarArchivoExcel2007 = procesarArchivoExcel2007;
	}

	public void setJugadorValidacionService(
			JugadorValidacionService jugadorValidacionService) {
		this.jugadorValidacionService = jugadorValidacionService;
	}

	public List<Jugador> obtenerJugadoresBD() {
		// TODO Auto-generated method stub
		return jugadorDao.obtenerJugadores();
		
	}

	public Jugador obtenerJugador(Long idCodigo) {
		// TODO Auto-generated method stub
		return jugadorDao.obtenerJugador(idCodigo.intValue());
	}
	
	
}
